package com.kfm.base.member;

/**
            类的成员：  字段、方法、成员类/接口

            成员类（内部类）: 在类的里面声明的类. 可以被继承

            外部类的访问修饰符只能是： public / package-access

            成员类的访问修饰符可以是所有的访问修饰符

            可以使用  final  static  abstract 等修饰符修饰成员类

            如何使用：
            static 成员类, 使用 类名. 调用. 使用 new 外部类.内部类();

            实例成员类， 使用外部类的对象来调用. 使用 对象.new 内部类();


            成员类属于类的成员，所以可以调用外部类的 private 成员
            在实例成员类中可以使用 外部类.this 表示外部类对象 (实例成员类是由外部类对象创建的)
            成员类中的 this 表示的是成员类

            外部类可以直接调用成员类的静态成员，实例成员需要创建成员类的对象来调用

            外部类可以访问成员类的 private 成员
         */
public class Demo {


    private static int b = 1;

    static class StaticInnerClass {
        int b = 2;

        private static int aa = 1;
        private int bb = 2;
        public void test(){
            System.out.println("Demo.StaticInnerClass :: test");
            System.out.println(Demo.b);
            System.out.println(b);
            System.out.println(this);
        }
    }

    public static void test(){
        StaticInnerClass.aa = 2;
        new StaticInnerClass().bb = 2;
    }

    public void t(){
        StaticInnerClass.aa = 3;

        new StaticInnerClass().bb = 3;
    }

    private int a = 1;
    class InnerClass {
        int a = 2;

        private static int aa = 1;
        private int bb = 2;
        public void test(){
            System.out.println("demo.InnerClass :: test");
            System.out.println(this);
            System.out.println(Demo.this); // 外部类对象
            System.out.println(this.a); // 2
            System.out.println(a); // 2
            System.out.println(Demo.this.a);
        }

        public static void test1(){

        }

    }

    public static void test1(){
        InnerClass.aa = 1;
        InnerClass.test1();

    }
}

class Demo1 {

    public static void main(String[] args) {
        Demo.StaticInnerClass staticInnerClass = new Demo.StaticInnerClass();// 创建 static 成员类的对象
        Demo.InnerClass innerClass1 = new Demo().new InnerClass();// 创建实例成员类的对象

        Demo demo = new Demo();
        System.out.println(demo);
        Demo.InnerClass innerClass = demo.new InnerClass();

//        staticInnerClass.test();
        innerClass.test();
    }

}
